﻿Option Explicit On

Imports CrystalDecisions.CrystalReports.Engine
Imports CrystalDecisions.Shared
Imports CrystalDecisions.Windows.Forms
Imports CrystalDecisions.ReportSource

''' <summary>
''' Tela para homologação de DANFE
''' </summary>
''' <remarks>3.4.3.26</remarks>
Public Class frmFerramentasDANFEHomologar
    Dim myCR As New ReportDocument
    Dim strFilePath As String = ""
    Dim blnDANFESvalidados As Boolean

    Private Sub frmFerramentasDANFEHomologar_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
        If blnDANFESvalidados = False Then
            Call MsgBox("Você não validou os DANFES já existentes na lista, terei que validá-los!", MsgBoxStyle.Exclamation)
            e.Cancel = Not ValidarDANFES()
        End If
    End Sub

    Private Sub frmFerramentasDANFEHomologar_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        With cmbTipo
            .Clear()
            .Add("Retrato", "1")
            .Add("Paisagem", "2")
            .SelectedIndex = 0
        End With
        Call MontaGrid()
        gpbDados.Enabled = False
    End Sub

    Private Sub MontaGrid()
        Try
            '-- DataGridView
            With dgvResult
                .SelectionMode = DataGridViewSelectionMode.FullRowSelect
                .AllowUserToAddRows = False
                .AllowUserToDeleteRows = False
                .AllowUserToResizeRows = False
                .ColumnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter
                .MultiSelect = False
                .ConnectionString = strMyDBString
                .TypeConnection = AnguloGridView.EnumTypeConection.SQLiteDataAdapterRW
                .SQL = "SELECT modelo, descricao, md5 " & _
                       "FROM danfes " & _
                       "ORDER BY lower(modelo) ASC"
                .AddColumn("Arquivo", 150)
                .AddColumn("Descrição", 150)
                .AddColumn("MD5", 250)
                .FillColumns()
                .Reload()
            End With
            '--
            With dgvOcorrencias
                .SelectionMode = DataGridViewSelectionMode.FullRowSelect
                .AllowUserToAddRows = False
                .AllowUserToDeleteRows = False
                .AllowUserToResizeRows = False
                .ColumnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter
                .MultiSelect = False
                .ConnectionString = strMyDBString
                .TypeConnection = AnguloGridView.EnumTypeConection.NoData
                .SQL = ""
                .AddColumn("Ocorrência", 0)
                .FillColumns()
            End With
        Catch ex As Exception
            Call SendError(ex.Message, ex.StackTrace)
        End Try
    End Sub

    Private Sub tbDanfe_ItemClicked(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ToolStripItemClickedEventArgs) Handles tbDanfe.ItemClicked
        Try
            Select Case e.ClickedItem.Tag
                Case "VAL"
                    Call ValidarDANFES()
                Case "HOM"
                    Call HomolgarDANFE()
            End Select
        Catch ex As Exception
            Call SendError(ex.Message, ex.StackTrace)
        End Try
    End Sub
    ''' <summary>
    ''' Rotina de validação de DANFE que já estejam na base de dados
    ''' </summary>
    ''' <remarks>3.4.3.26</remarks>
    Private Function ValidarDANFES() As Boolean
        Try
            Dim myMD5 As New ClsCrypto
            Dim myDT As DataTable = mySQLite.QueryDataTable("SELECT modelo, md5 FROM danfes")
            Dim strFileName, strFileMD5, strFilePath As String
            Dim strDANFEsPath As String = strAppPath & "\danfes"
            ValidarDANFES = True
            For intRow As Integer = 0 To myDT.Rows.Count - 1
                strFileName = myDT.Rows(intRow).Item("modelo")
                strFileMD5 = myDT.Rows(intRow).Item("md5")
                strFilePath = strDANFEsPath & "\" & strFileName
                If IO.File.Exists(strFilePath) Then
                    If myMD5.GetMD5HashFromFile(strFilePath) <> strFileMD5 Then
                        If MsgBox("O hash do arquivo [" & strFileName & "] não confere, você alterou este aquivo?", MsgBoxStyle.Question + MsgBoxStyle.YesNo) = MsgBoxResult.No Then
                            Call MsgBox("Se não foi você quem alterou, terei que tirá-lo da lista, ok?", MsgBoxStyle.Exclamation)
                        Else
                            Call MsgBox("Não esqueça de homologá-lo antes de sair da tela, ok?", MsgBoxStyle.Exclamation)
                            ValidarDANFES = False
                        End If
                        mySQLite.Execute("DELETE FROM danfes WHERE modelo='" & strFileName & "'")
                        mySQLite.Execute("UPDATE configuracoes SET valor='' WHERE nome='nfe.danfe.modelo' AND valor='" & strFileName & "'")
                    End If
                Else
                    If MsgBox("O DANFE  [" & strFileName & "] não está na pasta, você o apagou?", MsgBoxStyle.Question + MsgBoxStyle.YesNo) = MsgBoxResult.Yes Then
                        Call MsgBox("Neste caso terei que apagá-lo também, ok?", MsgBoxStyle.Exclamation)
                    Else
                        Call MsgBox("Neste caso homologue-o novamente, ok?", MsgBoxStyle.Exclamation)
                        ValidarDANFES = False
                    End If
                    mySQLite.Execute("DELETE FROM danfes WHERE modelo='" & strFileName & "'")
                    mySQLite.Execute("UPDATE configuracoes SET valor='' WHERE nome='nfe.danfe.modelo' AND valor='" & strFileName & "'")
                End If
            Next
            blnDANFESvalidados = True
        Catch ex As Exception
            Call SendError(ex.Message, ex.StackTrace)
            ValidarDANFES = False
        Finally
            dgvResult.Reload()
        End Try
    End Function
    ''' <summary>
    ''' Rotina de ferificação do DANFE 
    ''' </summary>
    ''' <remarks>3.4.3.26</remarks>
    Private Sub HomolgarDANFE()
        Try
            Dim TableName As String, FieldName As String = ""
            strFilePath = AbrirArquivo()
            cmdHomologar.Enabled = False
            '--
            With myCR
                .Load(strFilePath)
                '--
                dgvOcorrencias.Clear()
                For intTables As Integer = 0 To .Database.Tables.Count - 1
                    TableName = .Database.Tables(intTables).Name
                    For intFields As Integer = 0 To .Database.Tables.Item(TableName).Fields.Count - 1
                        FieldName = .Database.Tables.Item(TableName).Fields(intFields).Name
                        If VerificaDataSet(FieldName) = False Then
                            Call LancarOcorrencia("Campo não encontrado: [" & TableName & "." & FieldName & "]")
                        End If
                    Next
                Next
                '--
                If BuscarObjectName("logotipo1") = False Then
                    Call LancarOcorrencia("Não encontrei o objeto chamado 'logotipo1' pertencente ao campo [dtImages.logotipo]")
                End If
                '--
                If BuscarObjectName("xNome1") = False Then
                    Call LancarOcorrencia("Não encontrei o objeto chamado 'xNome1' pertencente ao campo [dtEmit.xNome]")
                End If
                '--
                If BuscarObjectName("xEndereco1") = False Then
                    Call LancarOcorrencia("Não encontrei o objeto chamado 'xEndereco1' pertencente ao campo [dtEmit.xEndereco]")
                End If
                .Close()
            End With
            '--
            If dgvOcorrencias.RowCount > 0 Then
                Call MsgBox("Não posso homologar seu DANFE sem a correção as ocorrências!", MsgBoxStyle.Exclamation)
                Exit Sub
            End If
            Call DANFELiberado()
        Catch ex As Exception
            Call SendError(ex.Message, ex.StackTrace)
        End Try
    End Sub
    ''' <summary>
    ''' Rotina de liberação de DANFE para homologação
    ''' </summary>
    ''' <remarks></remarks>
    Private Sub DANFELiberado()
        Try
            Dim myMD5 As New ClsCrypto
            cmdHomologar.Enabled = True
            txtModelo.Text = IO.Path.GetFileName(strFilePath)
            txtMD5.Text = myMD5.GetMD5HashFromFile(strFilePath)
            gpbDados.Enabled = True
        Catch ex As Exception
            Call SendError(ex.Message, ex.StackTrace)
        End Try
    End Sub
    ''' <summary>
    ''' Busca um objeto pelo nome no relatório
    ''' </summary>
    ''' <param name="strObjectname">Nome do objeto a ser procurado</param>
    ''' <returns></returns>
    ''' <remarks>3.4.3.26</remarks>
    Private Function BuscarObjectName(ByVal strObjectname As String) As Boolean
        With myCR
            For intObj As Integer = 0 To .ReportDefinition.ReportObjects.Count - 1
                If .ReportDefinition.ReportObjects.Item(intObj).Name = strObjectname Then
                    Return True
                End If
            Next
        End With
    End Function
    ''' <summary>
    ''' Rotina de lançamento de ocorrencia no grid
    ''' </summary>
    ''' <param name="strOcorrencia">Descrição das ocorrência.</param>
    ''' <remarks>3.4.3.26</remarks>
    Private Sub LancarOcorrencia(ByVal strOcorrencia As String)
        With dgvOcorrencias
            .Rows.Add()
            .TextMatrix(.RowCount - 1, 0) = strOcorrencia
        End With
    End Sub
    ''' <summary>
    ''' Rotina de verificação no DataSet dsDANFE, de existencia de campos
    ''' </summary>
    ''' <param name="FieldName">Campo a ser verificado</param>
    ''' <returns></returns>
    ''' <remarks>3.4.3.26</remarks>
    Private Function VerificaDataSet(ByVal FieldName As String) As Boolean
        Try
            Dim myDS As DataSet = New dsDANFE()
            For intDT As Integer = 0 To myDS.Tables.Count - 1
                For intColumns As Integer = 0 To myDS.Tables(intDT).Columns.Count - 1
                    If myDS.Tables(intDT).Columns(intColumns).ColumnName = FieldName Then
                        Return True
                    End If
                Next
            Next
        Catch ex As Exception
            Call SendError(ex.Message, ex.StackTrace)
        End Try
    End Function
    ''' <summary>
    ''' Retorna o caminho selecionado para a homologação do RPT
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks>3.4.3.26</remarks>
    Private Function AbrirArquivo() As String
        Try
            Dim AbrirComo As OpenFileDialog = New OpenFileDialog()
            Dim caminho As DialogResult
            AbrirArquivo = ""
            With AbrirComo
                .Title = "Abrir arquivos do Crystal Reports"
                .FileName = ""
                .Filter = "todos os arquivos (*.rpt)|*.rpt"
                caminho = .ShowDialog
                If .FileName.ToString.Trim <> String.Empty Then
                    If IO.File.Exists(.FileName.ToString.Trim) Then
                        AbrirArquivo = .FileName.ToString.Trim
                    End If
                End If
            End With
            If caminho = Windows.Forms.DialogResult.Cancel Then
                AbrirArquivo = ""
            End If
        Catch ex As Exception
            Call SendError(ex.Message, ex.StackTrace)
            AbrirArquivo = ""
        End Try
    End Function

    Private Sub cmdHomologar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdHomologar.Click
        If IsEmpty(txtModelo.Text) Then
            Call MsgBox("Nome do aquivo não foi selecionado!", MsgBoxStyle.Exclamation)
            Exit Sub
        End If
        If IsEmpty(txtDescricao.Text) Then
            Call MsgBox("Digite um nome para o DANFE!", MsgBoxStyle.Exclamation)
            txtDescricao.Select()
            Exit Sub
        End If
        If Not IsEmpty(mySQLite.ExecuteReturn("SELECT tipo FROM danfes WHERE descricao='" & txtDescricao.Text.Replace("'", "''").Trim & "'")) Then
            Call MsgBox("Já existe esta descrição para outro DANFE!", MsgBoxStyle.Exclamation)
            txtDescricao.Select()
            Exit Sub
        End If
        If TrataNull(cmbTipo.Value, TypeCode.Int16) = 0 Then
            Call MsgBox("Selecione o leiaute do DANFE, retrato ou paisagem!", MsgBoxStyle.Exclamation)
            cmbTipo.Select()
            Exit Sub
        End If
        Call GravarDANFE()
    End Sub
    ''' <summary>
    ''' Grava DANFE homologado na base de dados
    ''' </summary>
    ''' <remarks>3.4.3.26</remarks>
    Private Sub GravarDANFE()
        Try
            mySQLite.Query("SELECT * FROM danfes WHERE modelo='" & txtModelo.Text & "'")
            If mySQLite.EOF Then
                mySQLite.AddNew()
                mySQLite.Field("modelo") = txtModelo.Text
            End If
            mySQLite.Field("md5") = txtMD5.Text
            mySQLite.Field("descricao") = txtDescricao.Text
            mySQLite.Field("tipo") = cmbTipo.Value
            mySQLite.Update()
        Catch ex As Exception
            Call SendError(ex.Message, ex.StackTrace)
        Finally
            gpbDados.Enabled = False
            cmdHomologar.Enabled = False
            dgvResult.Reload()
            Call LimpaForm(gpbDados)
        End Try
    End Sub
End Class